D) Explicit Instance(Stack)

stack.hpp
#ifndef __STACK_HPP__
#define __STACK_HPP__
#include <deque>
template <typename T>
class Stack{
public:
void push(T const& elem);
void pop();
T top() const;
bool empty() const;
private:
std::deque<T> elems;
};
#endif
stack.cpp
#include "stack.hpp"
#include <string>
#include <iostream>
template <typename T>
void Stack<T>::push(T const& elem){
std::cout<<"Hello";
}
// std::string
template void Stack<std::string>::push(std::string const&);
Stack template의 push 구현을 std::string 타입에 대하여 명시적 인스턴스화가
stack.cpp를 읽는 과정에서 이루어 짐

오브젝트 파일에 Stack::push에 대한 구현이 존재
main.cpp
#include "stack.hpp"
int main(void){
Stack<std::string> a;
a.push(std::string("Hi"));
}
이후 사용할 때, 오브젝트 파일의 Stack::push 구현이 존재하기 때문에
이 후 링크할 때, 심볼을 링크할 수 있음

라이브러리 구현 중 일부 외부 노출을 피하고 싶은 경우, 명시적 인스턴스화 방식을 이용한다.